Skip to content

fix(ui): keep update release link visible#410

Merged
shantur merged 6 commits into
NeuralNomadsAI:devfrom
Pagecran:fix/persistent-update-link-refresh
May 8, 2026
Merged

fix(ui): keep update release link visible#410
shantur merged 6 commits into
NeuralNomadsAI:devfrom
Pagecran:fix/persistent-update-link-refresh

Conversation

@pascalandr

@pascalandr pascalandr commented May 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Keep a stable release link visible in the home screen version pill whenever update metadata is available.
  • Leave the existing one-time update toast behavior unchanged while giving users a permanent place to reopen the release page.
  • Reuse the existing release i18n strings instead of adding new UI copy.

Fixes #267

Verification

  • npm run typecheck --workspace @codenomad/ui
  • npm run build --workspace @codenomad/ui
image

@pascalandr

Copy link
Copy Markdown
Contributor Author

@CodeNomadBot

I want you to perform the gatekeeper checks for latest PR state

check for regressions
check for better possible implementations
Be the PR gatekeeper
Be ruthless about code quality

@codenomadbot

codenomadbot Bot commented May 8, 2026

Copy link
Copy Markdown
Contributor

Gatekeeper review for latest PR state complete.

Assumptions: I reviewed the checked-out codenomad/pr-410 branch against dev, and treated the request as a strict code-quality/regression review rather than an implementation request.

Findings:

  1. Blocking: the “permanent” release link is only populated from a one-shot metadata fetch, so it can miss updates discovered by the existing refresh loop. In packages/ui/src/components/version-pill.tsx:10-19, VersionPill calls getServerMeta() once and stores the result in component-local state. But the dev update monitor in packages/ui/src/stores/releases.ts:147-160 can later force-refresh metadata every 10 minutes and show the one-time toast when a new update appears. That refreshed meta.update never flows back into VersionPill, so if the app was already open before the dev release became available, the toast may appear but the footer pill still has no stable “View release” link after the toast is dismissed or missed. This directly weakens the stated goal of giving users a permanent place to reopen the release page. Better implementation: expose the current update metadata as a signal from stores/releases and update it in refreshFromMeta(), then have VersionPill consume that shared state instead of doing an independent one-shot fetch.

  2. Desktop/Tauri regression risk: the new link bypasses the app’s external URL opener. packages/ui/src/components/version-pill.tsx:46-49 renders a raw <a target="_blank">. On the same folder-selection screen, existing external links prevent default navigation and call openExternalUrl(...) specifically to route through @tauri-apps/plugin-opener when running in Tauri (packages/ui/src/components/folder-selection-view.tsx:571-581). The release link should follow that pattern; otherwise the desktop app can fail to open the browser or navigate the webview unexpectedly, making the newly added permanent link unreliable on the main desktop target.

Validation:

  • git diff --check dev...HEAD passed.
  • npm run typecheck --workspace @codenomad/ui could not complete in this workspace because dependencies are missing (solid-js, Tauri packages, SDK packages, etc.).
  • npm run build --workspace @codenomad/ui could not complete because vite is missing.

Gatekeeper status: not ready as-is. The feature direction is good, but the implementation should be wired into the existing release metadata source and should use the established external-link opener before merge.

--
Yours,
CodeNomadBot

Wire VersionPill to the shared release metadata signal so the permanent release link updates when the background dev-release refresh loop discovers a new build after the app has already loaded.

Route the release link through the existing external URL opener so the folder selection screen follows the same browser-opening path in Tauri and web instead of relying on raw anchor navigation.

Validation:
- npm run typecheck --workspace @codenomad/ui
- npm run build --workspace @codenomad/ui
@pascalandr

Copy link
Copy Markdown
Contributor Author

@CodeNomadBot

same review again

@codenomadbot

codenomadbot Bot commented May 8, 2026

Copy link
Copy Markdown
Contributor

Gatekeeper review for the latest PR state complete.

Assumptions: I reviewed the current checked-out codenomad/pr-410 branch against dev, including the new f2bf778 fix(ui): sync version pill with release refresh commit. I treated “same review again” as a strict regression/code-quality review only, with no code changes requested.

Findings:

  1. Blocking: the new shared update state can still render a stale release link after the server reports that no update is available. packages/ui/src/stores/releases.ts:84-86 correctly sets availableUpdate to meta.update ?? null on each forced refresh, but packages/ui/src/components/version-pill.tsx:22 computes availableUpdate() ?? meta()?.update ?? null. That fallback cannot distinguish “the shared refresh has not loaded yet” from “the shared refresh loaded and there is no update”. If VersionPill initially loaded metadata containing an update, then a later refresh returns meta.update = null after the user updates, the release is yanked, or the channel changes, availableUpdate() becomes null and the component falls back to the old local meta()?.update, keeping a stale “View release” link visible. This violates the stated behavior of showing the link when update metadata is available. Better implementation: make the shared update signal able to represent an uninitialized state separately from a loaded-empty state, e.g. initialize it as undefined and only fall back to local metadata while it is undefined; or remove the component-local update fallback once the release store is the source of truth.

Resolved from the prior review:

  • The version pill now observes release refresh state through useAvailableUpdate(), addressing the prior one-shot metadata concern for newly available updates.
  • The link now calls openExternalUrl(..., "version-pill"), matching the existing desktop/Tauri external-link pattern.

Validation:

  • git diff --check dev...HEAD passed.
  • npm run typecheck --workspace @codenomad/ui still cannot complete in this workspace because dependencies are missing (solid-js, Tauri packages, SDK packages, etc.).
  • npm run build --workspace @codenomad/ui still cannot complete because vite is missing.

Gatekeeper status: still not ready as-is. The main regression is narrower now, but the current fallback logic can keep outdated update metadata visible indefinitely.

--
Yours,
CodeNomadBot

pascalandr added 2 commits May 8, 2026 20:29
Represent the shared update signal with an explicit uninitialized state so VersionPill only falls back to its one-shot metadata fetch before the release store refreshes for the first time.

Once the shared release refresh has loaded, a null update now correctly clears the permanent release link instead of reviving stale local metadata.

Validation:
- npm run typecheck --workspace @codenomad/ui
- npm run build --workspace @codenomad/ui
Show a stable update link in the home screen version pill whenever the server advertises `support.latestServerUrl`, even when no dev-channel update payload is present.

This keeps the original dev-release link behavior, but also gives users a permanent update entry point in the exact case described by issue NeuralNomadsAI#267 where the transient toast may already be gone.

Validation:
- npm run typecheck --workspace @codenomad/ui
- npm run build --workspace @codenomad/ui
@github-actions

github-actions Bot commented May 8, 2026

Copy link
Copy Markdown

PR builds are available as GitHub Actions artifacts:

https://github.com/NeuralNomadsAI/CodeNomad/actions/runs/25572525695

Artifacts expire in 7 days.
Artifacts:

  • pr-410-c38b0c21987c7874ec66ff971a9abd573de8f5d4-tauri-macos-arm64
  • pr-410-c38b0c21987c7874ec66ff971a9abd573de8f5d4-electron-windows
  • pr-410-c38b0c21987c7874ec66ff971a9abd573de8f5d4-electron-linux

@NeuralNomadsAI NeuralNomadsAI deleted a comment from codenomadbot Bot May 8, 2026
pascalandr added 2 commits May 8, 2026 20:48
Remove the test-only fallback that surfaced `support.latestServerUrl` in the version pill even when no update payload was available.

This keeps the permanent link scoped to actual `meta.update` availability while preserving the earlier fixes that sync the version pill with the shared release refresh signal and route the link through the external opener.

Validation:
- npm run typecheck --workspace @codenomad/ui
- npm run build --workspace @codenomad/ui
@github-actions

github-actions Bot commented May 8, 2026

Copy link
Copy Markdown

PR builds are available as GitHub Actions artifacts:

https://github.com/NeuralNomadsAI/CodeNomad/actions/runs/25573160360

Artifacts expire in 7 days.
Artifacts: (none found on this run)

@pascalandr

Copy link
Copy Markdown
Contributor Author

@CodeNomadBot

same review again

@codenomadbot

codenomadbot Bot commented May 8, 2026

Copy link
Copy Markdown
Contributor

Gatekeeper review for the latest PR state complete.

Assumptions: I reviewed the current checked-out codenomad/pr-410 branch against dev, including 7bcc8c1 fix(ui): keep version pill update link opt-in and the merge commit d5271ef. I treated “same review again” as a strict regression/code-quality review only, with no code changes requested.

Findings:

No blocking findings in the current diff.

The prior false-positive CTA path is gone: packages/ui/src/components/version-pill.tsx no longer renders support.latestServerUrl; the persistent link is now tied to update() only. The prior stale update fallback remains addressed by using undefined as the shared update signal’s uninitialized state and null as the loaded-empty state.

Residual risks / notes:

  • I could not fully validate compilation locally because this workspace is still missing dependencies.
  • The latest artifact bot comment says artifacts were not found for its run, which may be a CI/artifact publishing issue outside this source diff.

Validation:

  • git diff --check dev...HEAD passed.
  • npm run typecheck --workspace @codenomad/ui could not complete locally because dependencies are missing (solid-js, Tauri packages, SDK packages, etc.).
  • npm run build --workspace @codenomad/ui could not complete locally because vite is missing.

Gatekeeper status: source review passes. I do not see remaining code-quality or regression blockers in the current PR diff, but merge confidence still depends on CI running with dependencies installed.

--
Yours,
CodeNomadBot

@github-actions

github-actions Bot commented May 8, 2026

Copy link
Copy Markdown

PR builds are available as GitHub Actions artifacts:

https://github.com/NeuralNomadsAI/CodeNomad/actions/runs/25573405726

Artifacts expire in 7 days.
Artifacts: (none found on this run)

@shantur shantur merged commit 7153169 into NeuralNomadsAI:dev May 8, 2026
10 of 11 checks passed
shantur added a commit that referenced this pull request May 14, 2026
…cloning, chat search and more (#443)

## Thanks for contributions

- [@pascalandr](https://github.com/pascalandr):
[#394](#394),
[#397](#397),
[#405](#405),
[#410](#410),
[#411](#411),
[#423](#423),
[#424](#424),
[#425](#425),
[#426](#426),
[#428](#428),
[#436](#436)
- [@jollyxenon](https://github.com/jollyxenon):
[#381](#381),
[#409](#409)
- [@OfflinePing](https://github.com/OfflinePing):
[#415](#415)

## Highlights

- **Web previews create a much tighter fix loop**: Open a live preview
from a session, highlight the exact part of the page that needs work,
and tell the model what to change right from the webpage. CodeNomad
sends that page and element context back into chat so the LLM can act on
specific visual feedback instead of vague descriptions.
- **Bringing repositories into CodeNomad is much easier**: You can now
clone a Git repository directly from the workspace picker, making it
faster to start work on a fresh project without leaving the app.
- **Searching inside long conversations is finally practical**: Session
history search can now find matches across messages, tool output, and
related content, helping you jump straight to the part of a conversation
you need.
- **Sessions are easier to manage at a glance**: Parent sessions now
show aggregated token and cost totals across subagents, the message
timeline can be hidden when you want more room, and tabs can be
reordered.
- **Mobile views and narrow screens feel much better**: Prompt controls,
message actions, timeline behavior, and other session UI pieces adapt
more cleanly when space gets tight.

## What’s Improved

- **Smoother workspace startup**: The home screen, empty states, and
startup flow are clearer, and returning between active projects and the
home view feels more natural.
- **More useful browsing and previewing**: Markdown now supports math
rendering, web previews are integrated into the session flow, and
unrestricted browsing respects the selected workspace root more
reliably.
- **Cleaner model and agent selection**: Models are grouped by provider,
and primary agent selection now follows OpenCode’s visibility rules more
closely.
- **Better prompt and attachment handling**: File attachment picking is
more consistent with drag-and-drop behavior, and prompt controls are
laid out more clearly in compact layouts.
- **More self-contained packaging**: Desktop builds do a better job
bundling the runtime, shipping the CodeNomad OpenCode plugin, and
producing more consistent release artifacts.

## Fixes

- **Permission flows are more reliable**: Stale permission events are
ignored after a reply, permission metadata is preserved more safely, and
attachment context survives more consistently.
- **Idle/session indicators behave more predictably**: Idle badges now
stay visible until they are actually seen, and session status behavior
is easier to understand across parent and child sessions.
- **Desktop and packaged builds are more dependable**: Bundled resources
refresh more reliably, packaged session storage is isolated correctly,
remote window titles are preserved, and Windows resource preparation
avoids a brittle shell path.
- **Compact layouts are less frustrating**: Message actions, tool-call
controls, timeline spacing, and prompt controls behave better in narrow
center panes and smaller screens.
- **Release/update navigation is clearer**: Update links stay visible
more reliably, making it easier to see and open release information when
an update is available.

### Contributors

-   [@pascalandr](https://github.com/pascalandr)
-   [@jollyxenon](https://github.com/jollyxenon)
-   [@OfflinePing](https://github.com/OfflinePing)

## Merged Pull Requests

### @shantur

- PR [#397](#397) “Add
clone repository workspace flow”
- PR [#399](#399)
“feat(ui): allow tab reordering”
- PR [#400](#400)
“feat(ui): add chat history search”
- PR [#430](#430) “Add
session web preview mode”
- PR [#432](#432)
“fix(ui): align prompt attachment picker with drop behavior”
- PR [#433](#433)
“Package CodeNomad OpenCode plugin”
- PR [#434](#434)
“Refactor workspace startup and empty session states”
- PR [#437](#437)
“Improve prompt layout for narrow session panes”
- PR [#438](#438)
“Improve messages layouts on narrow screens”

### @pascalandr

- PR [#394](#394)
“fix(tauri): refresh bundled resources on rebuild”
- PR [#405](#405)
“fix(tauri): prefer bundled server entry in release”
- PR [#410](#410)
“fix(ui): keep update release link visible”
- PR [#411](#411)
“fix(ui): return to active projects from home”
- PR [#423](#423)
“fix(ui): follow up idle badge behavior”
- PR [#424](#424)
“fix(ui): drain yolo permissions outside shell render”
- PR [#425](#425)
“fix(ui): ignore stale permission events after reply”
- PR [#426](#426)
“fix(ui): reconcile permission tool attachments”
- PR [#428](#428)
“feat(ui): make message timeline hideable”
- PR [#436](#436)
“fix(electron): avoid shell for resource prep”

### @OfflinePing

- PR [#415](#415)
“feat(ui): show aggregated total tokens and cost for parent sessions
including subagents”

### @jollyxenon

- PR [#381](#381)
“Fix(ui): Support Markdown Math Rendering”
- PR [#409](#409)
“fix(ui): align primary agent selection with OpenCode”
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update Message disappears

2 participants